diff --git a/web/chat/multimedia-message.react.js b/web/chat/multimedia-message.react.js --- a/web/chat/multimedia-message.react.js +++ b/web/chat/multimedia-message.react.js @@ -9,7 +9,6 @@ import { type InputState, InputStateContext } from '../input/input-state'; import Multimedia from '../media/multimedia.react'; -import { ModalContext } from '../modals/modal-provider.react'; import css from './chat-message-list.css'; import ComposedMessage from './composed-message.react'; import sendFailed from './multimedia-message-send-failed'; @@ -30,11 +29,10 @@ ...BaseProps, // withInputState +inputState: ?InputState, - +setModal: (modal: ?React.Node) => void, }; class MultimediaMessage extends React.PureComponent { render() { - const { item, setModal, inputState } = this.props; + const { item, inputState } = this.props; invariant( item.messageInfo.type === messageTypes.IMAGES || item.messageInfo.type === messageTypes.MULTIMEDIA, @@ -53,7 +51,6 @@ = React.memo( function ConnectedMultimediaMessage(props) { const inputState = React.useContext(InputStateContext); - const modalContext = React.useContext(ModalContext); - invariant(modalContext, 'ModalContext should be set in MultimediaMessage'); - return ( - - ); + return ; }, ); diff --git a/web/media/multimedia-modal.react.js b/web/media/multimedia-modal.react.js --- a/web/media/multimedia-modal.react.js +++ b/web/media/multimedia-modal.react.js @@ -13,7 +13,7 @@ type Props = { ...BaseProps, - +setModal: (modal: ?React.Node) => void, + +clearModal: (modal: ?React.Node) => void, }; class MultimediaModal extends React.PureComponent { @@ -35,7 +35,7 @@ > @@ -50,7 +50,7 @@ event: SyntheticEvent, ) => void = event => { if (event.target === this.overlay) { - this.close(); + this.props.clearModal(); } }; @@ -58,21 +58,17 @@ event: SyntheticKeyboardEvent, ) => void = event => { if (event.keyCode === 27) { - this.close(); + this.props.clearModal(); } }; - - close: () => void = () => { - this.props.setModal(null); - }; } -function ConnectedMultiMediaModal(props: Props): React.Node { +function ConnectedMultiMediaModal(props: BaseProps): React.Node { const { uri } = props; const modalContext = React.useContext(ModalContext); invariant(modalContext, 'modalContext should be set in MultimediaModal'); - return ; + return ; } export default ConnectedMultiMediaModal; diff --git a/web/media/multimedia.react.js b/web/media/multimedia.react.js --- a/web/media/multimedia.react.js +++ b/web/media/multimedia.react.js @@ -11,17 +11,21 @@ } from 'react-feather'; import { type PendingMultimediaUpload } from '../input/input-state'; +import { ModalContext } from '../modals/modal-provider.react'; import css from './media.css'; import MultimediaModal from './multimedia-modal.react'; -type Props = { - uri: string, +type BaseProps = { + +uri: string, pendingUpload?: ?PendingMultimediaUpload, remove?: (uploadID: string) => void, - setModal?: (modal: ?React.Node) => void, multimediaCSSClass: string, multimediaImageCSSClass: string, }; +type Props = { + ...BaseProps, + setModal?: (modal: ?React.Node) => void, +}; class Multimedia extends React.PureComponent { componentDidUpdate(prevProps: Props) { const { uri, pendingUpload } = this.props; @@ -108,8 +112,33 @@ const { setModal, uri } = this.props; invariant(setModal, 'should be set'); - setModal(); + setModal(); }; } -export default Multimedia; +const ConnectedMultimediaContainer: React.ComponentType = React.memo( + function ConnectedMultimediaContainer(props) { + const { + uri, + pendingUpload, + remove, + multimediaCSSClass, + multimediaImageCSSClass, + } = props; + const modalContext = React.useContext(ModalContext); + invariant(modalContext, 'modalContext should be defined'); + + return ( + + ); + }, +); + +export default ConnectedMultimediaContainer;